import Qs from './qs.js'
import {
	baseApi
} from './config.js'

const paramsFormat = (params) => {
	// 处理对象格式的参数，格式化为字符串
	return Qs.stringify(params, {
		allowDots: true,
		arrayFormat: 'indices'
	})
}

const request = (customConfig) => {

	return new Promise((resolve, reject) => {

		const config = {
			...customConfig,
			success(res) {
				if (typeof customConfig.success === 'function') {
					// 执行customConfig中传入的回调
					customConfig.success(res)
				} else {
					// 默认相应拦截
					console.log(res)
				}
				// 必须释放promise
				resolve(res)
			},
			fail(err) {
				if (typeof customConfig.fail === 'function') {
					// 执行customConfig中传入的回调
					customConfig.fail(res)
				} else {
					// 默认相应拦截
					console.log(res)
				}
				// 必须释放promise
				reject(err)
			}
		}

		if (config.params && typeof config.params !== 'string') {
			// 例如get请求，例如post请求使用url传参，需要对数组进行处理，所以推荐使用params传参，并用qs处理
			// 如果config中依旧有data参数，则依旧按照uniapp原有的逻辑处理
			config.url + '?' + paramsFormat(config.params)
		} else if (config.method === 'POST' && config.headers && config.headers['content-type'].indexOf(
				'x-www-form-urlencoded') > -1) {
			// 这里对一些特殊情况处理，例如使用urlencoded方法传参的POST请求
			if (config.data && typeof config.data !== 'string') {
				config.data = paramsFormat(config.data)
			}
		}

		config.url = baseApi + config.url // 添加默认请求路径

		uni.request(config) // 执行uniapp的request，在回调函数中释放promise

	})

}

const instance = (customConfig) => {
	return request(customConfig)
}

instance.prototype.get = (url, params, customConfig) => {
	customConfig.url = url
	customConfig.method = 'GET'
	customConfig.params = params
	return request(customConfig)
}

instance.prototype.post = (url, data, customConfig) => {
	customConfig.url = url
	customConfig.method = 'POST'
	customConfig.data = data
	customConfig.headers = {
		...(customConfig.headers ? customConfig.headers : {}),
		'content-type': 'application/json' // 对于post请求，默认使用application/json
	}
}

export default instance